﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Fly.Common.Helper
{
    /// <summary>
    /// 数据校验
    /// </summary>
    public static class Verification
    {
        #region 判断指定的字符串是否是由数字、26个英文字母或者下划线组成(一般用作密码)
        /// <summary>
        /// 判断指定的字符串是否是由数字、26个英文字母或者下划线组成(一般用作密码)
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsPassword(string input)
        {
            if (String.IsNullOrWhiteSpace(input))
            {
                return false;
            }
            return Regex.IsMatch(input, "^/w+$");
        } 
        #endregion

        #region 判断指定的字符串是否是合法的账户名(字母开头，允许5-16字节，允许字母数字下划线)
        /// <summary>
        /// 判断指定的字符串是否是合法的账户名(字母开头，允许5-16字节，允许字母数字下划线)
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsAccount(string input)
        {
            if (String.IsNullOrWhiteSpace(input))
            {
                return false;
            }
            return Regex.IsMatch(input, "^[a-zA-Z][a-zA-Z0-9_]{4,15}$");
        } 
        #endregion

        #region 校验指定的字符串是否是 Email 地址
        /// <summary>
        /// 校验指定的字符串是否是 Email 地址
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsEmial(string input)
        {
            if (String.IsNullOrWhiteSpace(input))
            {
                return false;
            }
            return Regex.IsMatch(input, "^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$");
        } 
        #endregion

        #region 校验指定的字符串是否是 IPV4 地址
        /// <summary>
        /// 校验指定的字符串是否是 IPV4 地址
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsIpAddress(string input)
        {
            if (String.IsNullOrWhiteSpace(input))
            {
                return false;
            }
            return Regex.IsMatch(input,
                "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$");
        } 
        #endregion

        #region 是否是邮政编码
        /// <summary>
        /// 是否是邮政编码
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsPostalCode(string input)
        {
            if (String.IsNullOrWhiteSpace(input))
            {
                return false;
            }
            return Regex.IsMatch(input, "[1-9]d{5}(?!d)");
        } 
        #endregion

        #region 判断指定的字符串长度是否在指定的开始和结束长度之间
        /// <summary>
        /// 判断指定的字符串长度是否在指定的开始和结束长度之间
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <param name="start">开始长度</param>
        /// <param name="end">结束长度</param>
        /// <returns></returns>
        public static bool IsBetween(string input, int start, int end)
        {
            if (String.IsNullOrEmpty(input))
            {
                return false;
            }
            if (start > end)
            {
                throw new ArgumentException("开始长度不能大于结束长度!");
            }
            return input.Length >= start && input.Length <= end;
        } 
        #endregion

        #region 判断指定的输入是否是数字
        /// <summary>
        /// 判断指定的输入是否是数字
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsNumber(string input)
        {
            if (String.IsNullOrEmpty(input))
            {
                return false;
            }
            return Regex.IsMatch(input, @"^(\-|\+)?\d+(\.\d+)?$");
        } 
        #endregion

        #region 判断是否是小数
        /// <summary>
        /// 判断是否是小数
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsFloat(string input)
        {
            if (String.IsNullOrEmpty(input))
            {
                return false;
            }
            return Regex.IsMatch(input, @"^((\-|\+)?\d+)(\.\d+)?$");
        } 
        #endregion

        #region 是否是域名(不包含访问协议和主机头的域名)
        /// <summary>
        /// 是否是域名(不包含访问协议和主机头的域名)
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsSite(string input)
        {
            if (String.IsNullOrEmpty(input))
            {
                return false;
            }
            return Regex.IsMatch(input, "[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?");
        } 
        #endregion

        #region 是否是一个可访问的Url
        /// <summary>
        /// 是否是一个可访问的Url
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsUrl(string input)
        {
            if (String.IsNullOrEmpty(input))
            {
                return false;
            }
            return Regex.IsMatch(input, @"[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$");
        } 
        #endregion

        #region 判断字符串是否经过 Base64 编码
        /// <summary>
        /// 判断字符串是否经过 Base64 编码
        /// </summary>
        /// <param name="str">需要判断的字符串</param>
        /// <returns></returns>
        public static bool IsBase64String(string str)
        {
            return Regex.IsMatch(str, "[A-Za-z0-9\\+\\/\\=]");
        } 
        #endregion

        #region 判断是否是 Int32 类型
        /// <summary>
        /// 判断是否是 Int32 类型
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static bool IsInt(string str)
        {
            return Regex.IsMatch(str, "^[0-9]*$");
        } 
        #endregion

        #region 时间与日期校验
        #region 是否是一年的12个月份
        /// <summary>
        /// 是否是一年的12个月份
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsMonth(string input)
        {
            if (String.IsNullOrEmpty(input))
            {
                return false;
            }
            return Regex.IsMatch(input, "^(0?[1-9]|1[0-2])$");
        }
        #endregion

        #region 是否是每月的31天
        /// <summary>
        /// 是否是每月的31天
        /// </summary>
        /// <param name="input">需要校验的字符串</param>
        /// <returns></returns>
        public static bool IsDay(string input)
        {
            return Regex.IsMatch(input, "^((0?[1-9])|((1|2)[0-9])|30|31)$");
        }
        #endregion

        #region 判断是否是日期格式
        /// <summary>
        /// 判断是否是日期格式
        /// </summary>
        /// <param name="str">需要判断的字符串</param>
        /// <returns></returns>
        public static bool IsDateString(string str)
        {
            return Regex.IsMatch(str, "(\\d{4})-(\\d{1,2})-(\\d{1,2})");
        }
        #endregion

        #region 判断是否是一个时分秒格式的时间
        /// <summary>
        /// 判断是否是一个时分秒格式的时间
        /// </summary>
        /// <param name="timeval"></param>
        /// <returns></returns>
        public static bool IsTime(string timeval)
        {
            return Regex.IsMatch(timeval, "^((([0-1]?[0-9])|(2[0-3])):([0-5]?[0-9])(:[0-5]?[0-9])?)$");
        }
        #endregion 
        #endregion
    }
}
